package com.example.algorithm.model;

/**
 * @auth Administrator
 * @create @2025/4/24@21:04
 * @decription
 * No.641 设计CircularDeque
 *设计实现循环双端队列。
 * 实现 MyCircularDeque 类
 * MyCircularDeque(int k):构造函数,双端队列最大为 k。
 * boolean insertFront():将一个元素添加到双端队列头部。如果操作成功返回 true，否则返回false .
 * boolean insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true，否则返回。
 * false 。
 * boolean deleteFront(): 从双端队列头部删除一个元素。如果操作成功返回 true，否则返回false 。
 * boolean deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true，否则返回ofalse 。
 * int getFront():从双端队列头部获得一个元素。如果双端队列为空，返回 -1。e
 * int getRear():获得双端队列的最后一个元素。 如果双端队列为空，返回 -1。
 * boolean isEmpty():若双端队列为空，则返回 true，否则返回 false 。
 * boolean isFull():若双端队列满了，则返回 true，否则返回 false 。
 *
 **/
public class MyCircularDeque {

    /**
     * 元素数组
     */
    private int[] elements;

    /**
     * 头与尾部位置及总数量
     */
    private int head=0,tail=-1,count=0;

    /**
     * 构造函数,双端队列最大为 k。
     * @param k
     */
    MyCircularDeque(int k){
        elements = new int[k];
    }

    /**
     * 若双端队列为空，则返回 true，否则返回 false 。
     * @return
     */
    public boolean isEmpty(){
        return count==0;

    }

    /**
     * 若双端队列满了，则返回 true，否则返回 false
     * @return
     */
    public boolean isFull(){
        return count==elements.length;

    }

    /**
     * 从双端队列头部获得一个元素。如果双端队列为空，返回 -1。e
     * @return
     */
    public int getFront(){
        if(isEmpty()){
            return -1;
        }
        return elements[head];

    }

    /**
     * 获得双端队列的最后一个元素。 如果双端队列为空，返回 -1。
     * @return
     */
    public int getRear(){
        if(isEmpty()){
            return -1;
        }
        return elements[tail==0?elements.length-1:tail-1];

    }

    /**
     * 将一个元素添加到双端队列头部。如果操作成功返回 true，否则返回false .
     * @param value
     * @return
     */
    public boolean insertFront(int value){
        if(isFull()){
            return false;
        }
        head=head==0?elements.length-1:--head;
        elements[head]=value;
        count++;
        return true;
    }

    /**
     * 将一个元素添加到双端队列尾部。如果操作成功返回 true，否则返回false
     * @param value
     * @return
     */
    public boolean insertLast(int value){
        if(isFull()){
            return false;
        }
        elements[tail]=value;
        tail=tail==elements.length-1?0:++tail;
        count++;
        return true;
    }

    /**
     * 从双端队列头部删除一个元素。如果操作成功返回 true，否则返回false
     * @return
     */
    public boolean deleteFront(){
        if(isEmpty()){
            return false;
        }
        elements[head]=-1;
        head=head==elements.length-1?0:++head;
        count--;
        return true;
    }

    /**
     * 从双端队列尾部删除一个元素。如果操作成功返回 true，否则返回ofalse
     * @return
     */
    public  boolean deleteLast(){
        if(isEmpty()){
            return false;
        }
        tail=tail==elements.length-1?0:--tail;
        elements[tail]=-1;
        count--;
        return true;
    }

}
